/*
 * AbstractTedSocket.h
 *
 *  Created on: 2013. 7. 23.
 *      Author: ncanis
 */
#pragma once

#include "stdafx.h"

#include "Util.h"
#include "Logger.h"
#include "IoBuffer.h"
#include "SocketHandler.h"
#include "IoSession.h"
#include "DefaultIoSession.h"
#include "SocketSessionConfig.h"



// ws2_32.lib 라이브러리 include
/**
 * pragma 사용법
 *  once : 한번만 컴파일 하라
 *  warning : 컴파일러에서 알려주는 경고를 임의로 제거
 *  warning( disable : 4996) : ex> string 관련 함수 경고 없애라
 *  message() : 컴파일중 메세지 뿌리기
 */

// winsock 2.0 버전을 사용하게 해주는 함수와 선언들 존재
// mingw => .a 파일,   visual c++ => .lib
// 전처리기에 -lws2-32 를 넣어주면 된다.
// #pragma comment(lib, "libws2_32.a")

namespace TED {

//to avoid circular dependencies among headers.
class SocketHandler;
class IoBuffer;
class SocketSessionConfig;
class IoSession;

/**
 * @author ncanis 
 * Socket Network Abstract class
 * 
 * 도움될만한 사이트 : http://www.gpgstudy.com/gpgiki/%EC%86%8C%EC%BC%93%20%EA%B0%95%EC%A2%8C
 */
class AbstractSocket {
protected:
	SocketSessionConfig* socketConfig; //소켓 설정정보
	TCHAR* ip; // network address
	INT port; // network port
	SOCKADDR_IN address; // 주소 정보
	SocketHandler* handler; // Socket 이벤트 핸들러
	WSAData wsaData; //소켓 초기화 호출에 의해 반환된 정보
	CriticalSectionManager csLock;

	IoSession& MakeSession(SOCKET sock);
	SOCKET Init(); // 소켓 초기화
	// @session 전송세션
	// @buf 수신할 데이터 장보
	INT16 Recv( IoSession& session, IoBuffer* buf=NULL);
	void Error(INT32 errorCode, const TCHAR* msg);

	// 연결된 세션에 대해 Blocking 설정을 한다.
	int SetBlocking(SOCKET socket, bool blocking);

public:
	AbstractSocket();
	AbstractSocket(SocketHandler* handler, const TCHAR* ip, const INT port);
	virtual ~AbstractSocket();

	SocketHandler& GetHandler();	
	void SetBufferSize(INT bufSize);
	virtual void Close(IoSession& session);
	bool Send(IoSession& session, IoBuffer& buf);
	SocketSessionConfig& GetSessionConfig(); // 소켓 설정 정보
	

};

// Thread Parameter
typedef struct {
	VOID* socket;	
	IoSession* session;
}SocketThreadParameter;

} /* namespace ted */

